GIT

00:24 0 Comments A + a -

Kilka dni temu miałem przyjemność poprowadzić w firmie wewnętrzne szkolenie/wstęp do Gita.

BTW, za swój osobisty sukces uważam fakt, że już po pierwszym miesiÄ…cu pracy dostaÅ‚em szansÄ™ “oficjalnego” zaprezentowania zajebistoÅ›ci Gita programistom chÅ‚ostanym dotychczas bezlitoÅ›nie przez TFSowÄ… kontrolÄ™ wersji witkami z doczepionymi haczykami na ryby po osolonych plecach. Efekt byÅ‚ dość prosty do przewidzenia: podobaÅ‚o siÄ™.

Poniżej wrzucam swoją listę tematów do poruszenia. Moim zdaniem są to najważniejsze elementy do pokazania w sensownym czasie nieprzekraczającym połowy dnia pracy, gdzie zostaje jeszcze sporo luzu na eksperymentowanie i demonstrowanie na żywo pewnych najczęściej spotykanych scenariuszy. Może ta lista posłuży komuś do wyjścia w swojej firmie z podobną inicjatywą, czyli zaprezentowania Gita szerszemu gronu? Gitersi wszystkich firm, łączmy się;).

Co to jest Git i dlaczego jest lepszy niż TFS:

  • rozproszony system kontroli wersji
  • każdy ma swoje peÅ‚ne repozytorium
  • diff/log/… – wszystko lokalnie
  • commity – też lokalnie
  • komunikacja z centralnym serwerem (jedna z możliwoÅ›ci podzielenia siÄ™ kodem z zespoÅ‚em)
    • pull – pobranie najnowszego kodu
    • push – wysÅ‚anie wÅ‚asnych commitów
    • “remotes” – linki do zdalnych repozytorium
  • gałęzie
    • gałąź “główna” – master
    • lokalne gałęzie – caÅ‚kowita swoboda w poruszaniu siÄ™ i organizacji pracy
  • żadnych exclusive locks
  • Å›wietny merge
  • Å›ledzi zawartość plików, a nie pliki
    • stÄ…d automatyczne wykrywa np. rename
  • (blog) Git – rozproszony system kontroli wersji (DVCS) – krótkie omówienie i garść linków
  • (blog) W czym Git jest lepszy od TFS?

Komendy do poruszania siÄ™ po gicie:

  • pull – Å›ciÄ…ga kod z centralnego serwera i łączy z naszym
  • push – wysyÅ‚a nasz kod (lokalne commity) na centralny serwer
  • checkout
    • po podaniu nazwy gałęzi: przełącza working copy miÄ™dzy gałęziami
    • z flagÄ… ‘-b’ – tworzy nowÄ… gałąź
    • po podaniu nazwy pliku: Å›ciÄ…ga plik z podanej wersji (bez podania wersji – Å›ciÄ…ga z ostatniego commita -> usuwa “niezacommitowane” zmiany)
  • branch
    • listuje aktualne gałęzie
    • z flagÄ… ‘-d’ – usuwa gałąź o podanej nazwie
  • help: git [command]–help
  • (blog) Git – poczÄ…tek – pierwsze kroki po instalacji gita

Indeks (“staging area”):

  • miejsce miÄ™dzy working copy a commitem
  • “cache” zmian, które znajdÄ… siÄ™ w nastÄ™pnym commicie
  • pozwala na bardzo dokÅ‚adnÄ… kontrolÄ™ nad tym co zostanie zacommitowane
  • można dowolnie manipulować zawartoÅ›ciÄ… indeksu, np zapisujÄ…c tam tylko część pliku do commita

Komendy do working copy, indeksu i commitów:

  • add – dodanie zmian do indeksu
    • add -A – dodanie wszystkich zmian do indeksu
    • add -i – interactive add, dokÅ‚adna kontrola nad tym co zostanie dodane do indeksu
    • add -i -> patch – dodawanie części zmian z danego pliku do indeksu
  • commit – stworzenie commita z aktualnego stanu indeksu
    • pierwsza linijka w commit msg – krótki opis, potem pusta linia, potem ew. dÅ‚uższy opis – tip dla narzÄ™dzi wyÅ›wietlajÄ…cych logi
  • clean – czyszczenie plików ‘untracked’
  • reset – czyszczenie indeksu
    • reset –hard – czyszczenie indeksu i working copy, coÅ› jak “undo pending changes”
  • stash – zachowanie aktualnych zmian na później, poza indeksem i poza commitami (coÅ› jak shelve, tylko lokalnie)

Struktura commitów

  • lokalne commity – lista podzielona na gałęzie
    • każdy commit jednoznacznie identyfikowany SHA1 ID
    • każdy commit można otagować
  • ostatni commit w gałęzi to HEAD
  • merge tworzy “merge commit” bÄ™dÄ…cy dzieckiem dwóch commitów
    • można zrobić merge bez tego, ale nie ma sensu w to teraz wnikać
  • można dowolnie nawigować siÄ™ pomiÄ™dzy commitami (znajÄ…c jego ID, nazwÄ™ bÄ…dź poÅ‚ożenie relatywne do innego znanego commita, np koÅ„cówki gałęzi)
    • git checkout master^ – 1 commit przed HEAD master
    • git checkout master~4 – 4 commity przed HEAD master

Modyfikacja historii:

  • commit –amend – modyfikacja ostatniego commita
  • rebase – “naÅ‚ożenie” jednej gałęzi na drugÄ… gałąź
  • rebase -i – interactive rebase
    • reword
    • edit
    • squash
  • NIE WOLNO modyfikować historii już wysÅ‚anej na serwer (!!!)
    • standardowo git nie pozwoli tego zrobić, jeÅ›li wysyÅ‚amy do innego repo gita…
    • … ale nie wiem jak zachowa siÄ™ TFS
  • (blog) Modyfikacja historii w Gicie

Git-TFS:

  • workflow:
    • [master]
    • git tfs pull – mamy najnowszy kod z repo
    • git checkout -b our-branch-name – tworzymy gałąź do bieżących prac
    • git add/commit… – pracujemy
    • git add/commit… – pracujemy

      git add/commit… – pracujemy

    • git checkout master – powracamy do gałęzi głównej
    • git tfs pull – Å›ciÄ…gamy najnowszy kod (w [master]zawsze mamy kod bez swoich modyfikacji)
    • git checkout our-branch-name – wracamy na naszÄ… gałąź
    • git rebase master – “nakÅ‚adamy” naszÄ… gałąź na najnowszy kod z TFS (ew. radzimy sobie z merge – mi siÄ™ tutaj jeszcze nie zdarzyÅ‚o żebym musiaÅ‚ to robić)
    • wysyÅ‚amy zmiany do TFS
      • git tfs rcheckin -w [task id]– wypychamy nowe commity z naszej gałęzi do TFSa mówiÄ…c z jakim taskiem ma skojarzyć; commit messages zostanÄ… umieszczone jako komentarz do checkina
        • dziaÅ‚anie “pod spodem”: push jednego commita -> pull -> rebase -> …
        • może kilka chwil potrwać
      • git tfs checkintool –build-default-comment
        • łączy wszystkie commity w jeden
    • git checkout master – powracamy do gałęzi głównej
    • git tfs pull – Å›ciÄ…gamy do [master]a nasze zmiany (plus ewentualnie inne które wydarzyÅ‚y siÄ™ w tym czasie)
    • git branch -d our-branch-name – kasujemy naszÄ… gałąź, nie jest już potrzebna (możemy skasować bo wszystkie zmiany z niej sÄ… w masterze, inaczej git by na to nie pozwoliÅ‚)
  • (blog) git-tfs – lek na prawie caÅ‚e zÅ‚o

Narzędzia:

  • git bash (z aliasami gita lub autohotkeys)
  • tortoise git
    • używam do logów i diffów z total commandera
    • dla mnie osobiÅ›cie najwygodniejsze
  • gitk
    • wbudowany log-viewer
    • pokazuje stan indeksu vs stan working copy
    • dla mnie mimo wszystko żółwik jest wygodniejszy
  • git gui
    • wbudowany ‘okienkowy klient’ do kontaktu z gitem
    • przydaje mi siÄ™ tylko gdy odpalam raz na jakiÅ› czas żeby zobaczyć czy pora na ‘cleanup’
      • sugeruje uruchomienie git gc jeÅ›li jest taka potrzeba
  • git extensions for visual studio
    • testowaÅ‚em dawno temu, ale okazaÅ‚o siÄ™ że tego nie potrzebujÄ™
      • VS jest wystarczajÄ…co wolny bez dodatkowych obciążeÅ„
  • git source control provider
    • nie testowaÅ‚em, ale j/w – nie potrzebujÄ™; poza tym dodaje okna ‘pending changes’ etc… których nie chcÄ™
  • nawigacja po narzÄ™dziach – u mnie
    • [win]+1 – total cmd (menu -> l -> enter = view log)
    • [win]+2 – vs
    • [win]+3 – git bash

Wow-factor:

  • git bisect – identyfikacja commita powodujÄ…cego błąd w systemie, na przestrzeni dÅ‚ugiej historii [blog]
  • git cherry-pick – przenoszenie jednego commita pomiÄ™dzy gałęziami
  • git reflog – historia WSZYSTKICH operacji

Linki:

.